package com.accounting.juanjuan.utils;

import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;

/**
 * @Author xxj
 * @Date 2024/1/26 9:38
 * @Version 1.0
 */
public class StringUtil {
    /**
     * 是否包含文本
     * <p>
     * 至少存在一个非空白字符
     * </p>
     *
     * @param str 字符串
     * @return 是否包含文本
     */
    private static boolean containsText(@NonNull CharSequence str) {
        int strLen = str.length();
        for (int i = 0; i < strLen; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 至少存在一个非空白字符
     * <p>
     * 检查给定的String是否包含实际的文本。
     * 更具体地说，如果String不是null，其长度大于0，
     * 并且包含至少一个非空白字符，则此方法返回true
     *
     * @param str 字符串
     * @return 是否包含文本
     */
    public static boolean hasText(@Nullable CharSequence str) {
        return (str != null && str.length() > 0 && containsText(str));
    }

    /**
     * 检查是否为空Empty
     * <p>
     * 如果为null,长度小于等于0，或者是一个空白字符串，都返回true，否则返回false。
     * </p>
     *
     * @param str 待检查字符串
     * @return 是否为空
     */
    public static boolean isEmpty(@Nullable CharSequence str) {
        return !hasText(str);
    }

    /**
     * 判断是否为空，如果null,空串,空格则一并认为空
     *
     * @param str 验证的字符串
     * @return 是否为空
     */
    public static boolean isBlank(@Nullable String str) {
        return !StringUtils.hasText(str);
    }

    /**
     * 根据文件名称获取扩展名
     *
     * @param fileName 文件名称
     * @return 扩展名
     */
    public static String getExtension(@NonNull String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1)
                .toLowerCase();
    }

    /**
     * 根据文件名称获取文件名，不带扩展名
     *
     * @param fileName 文件名称
     * @return 纯文件名
     */
    public static String getFileNameWithoutExt(@NonNull String fileName) {
        return fileName.substring(0, fileName.lastIndexOf("."))
                .toLowerCase();
    }

    /**
     * 判断字符是否为汉字的方法
     *
     * @param c 字符
     * @return
     */
    public static boolean isChinese(char c) {
        // 汉字的Unicode范围为 \u4e00 - \u9fa5
        return '\u4e00' <= c && c <= '\u9fa5';
    }

    /**
     * 计算字符串长度的方法(汉字两个，字母一个)
     *
     * @param text
     * @return
     */
    public static int calculateLength(String text) {
        int length = 0;
        // 遍历字符串中的每个字符
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            // 使用Unicode范围来判断字符是否为汉字
            if (isChinese(c)) {
                length += 2;
            } else {
                length++;
            }
        }
        return length;
    }
}
